When S3 buckets versioning is enabled it’s possible to add an additional authentication factor before being allowed to delete versions of an object
or changing the versioning state of a bucket. It prevents accidental object deletion by forcing the user sending the delete request to prove that he
has a valid MFA device and a corresponding valid token.
Ask Yourself Whether
- The S3 bucket stores sensitive information that is required to be preserved on the long term.
- The S3 bucket grants delete permission to many users.
There is a risk if you answered yes to any of those questions.
Recommended Secure Coding Practices
It’s recommended to enable S3 MFA delete, note that:
- MFA delete can only be enabled with the AWS CLI or API and with the root account.
- To delete an object version, the API should be used with the
x-amz-mfa
header.
- The API request, with the
x-amz-mfa
header, can only be used in HTTPS.
Sensitive Code Example
A versioned S3 bucket does not have MFA delete enabled for AWS provider version 3 or below:
resource "aws_s3_bucket" "example" { # Sensitive
bucket = "example"
versioning {
enabled = true
}
}
A versioned S3 bucket does not have MFA delete enabled for AWS provider version 4 or above:
resource "aws_s3_bucket" "example" {
bucket = "example"
}
resource "aws_s3_bucket_versioning" "example" { # Sensitive
bucket = aws_s3_bucket.example.id
versioning_configuration {
status = "Enabled"
}
}
Compliant Solution
MFA delete is enabled for AWS provider version 3 or below:
resource "aws_s3_bucket" "example" {
bucket = "example"
versioning {
enabled = true
mfa_delete = true
}
}
MFA delete is enabled for AWS provider version 4 or above:
resource "aws_s3_bucket" "example" {
bucket = "example"
}
resource "aws_s3_bucket_versioning" "example" {
bucket = aws_s3_bucket.example.id
versioning_configuration {
status = "Enabled"
mfa_delete = "Enabled"
}
mfa = "${var.MFA}"
}
See